home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
gtlayout-source.lha
/
LTP_LevelImage.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-10-03
|
11KB
|
466 lines
/*
** GadTools layout toolkit
**
** Copyright © 1993-1996 by Olaf `Olsen' Barthel
** Freely distributable.
**
** :ts=4
*/
#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif
#ifdef DO_LEVEL_KIND
/*****************************************************************************/
STATIC VOID
DrawLevelImageLeft(struct RastPort *RPort,UWORD *Pens,LevelImageInfo *Level,struct Image *Image,LONG Left,LONG Top,LONG Width,LONG Height,LONG OffsetX,LONG OffsetY)
{
LONG BorderTop = Level->KnobTop,
BorderLeft = Level->KnobWidth;
Left += OffsetX;
Top += OffsetY;
if(Width > 0)
{
LTP_SetAPen(RPort,Pens[SHADOWPEN]);
LTP_DrawLine(RPort,Left,Top,Left,Top + Height - 1);
if(Width > 1)
{
LTP_DrawLine(RPort,Left + 1,Top,Left + 1,Top + Height - 2);
LTP_SetAPen(RPort,Pens[SHINEPEN]);
WritePixel(RPort,Left + 1,Top + Height - 1);
if(Width > 2)
{
LTP_DrawLine(RPort,Left + 2,Top + Height - 1,Left + Width - 1,Top + Height - 1);
LTP_SetAPen(RPort,Pens[SHADOWPEN]);
LTP_DrawLine(RPort,Left + 2,Top,Left + Width - 1,Top);
LTP_SetAPen(RPort,Pens[FILLPEN]);
RectFill(RPort,Left + 2,Top + 1,Left + Width - 1,Top + Height - 2);
}
}
EraseRect(RPort,Left,Top - BorderTop,Left + Width - 1,Top - 1);
LTP_EraseBox(RPort,Left,Top + Height,Width,BorderTop);
EraseRect(RPort,Left - BorderLeft,Top - BorderTop,Left - 1,Top + Height + BorderTop - 1);
}
else
{
if(Level->Position < BorderLeft && Level->Position > 0)
{
Left = Image->LeftEdge + OffsetX;
Width = Level->Position;
EraseRect(RPort,Left,Top - BorderTop,Left + Width - 1,Top + Height + BorderTop - 1);
}
}
}
/*****************************************************************************/
STATIC VOID
DrawLevelImageRight(struct RastPort *RPort,UWORD *Pens,LevelImageInfo *Level,struct Image *Image,LONG Left,LONG Top,LONG Width,LONG Height,LONG OffsetX,LONG OffsetY)
{
LONG BorderTop = Level->KnobTop,
BorderLeft = Level->KnobWidth;
Left += OffsetX;
Top += OffsetY;
if(Width > 0)
{
LTP_SetAPen(RPort,Pens[SHINEPEN]);
LTP_DrawLine(RPort,Left + Width - 1,Top,Left + Width - 1,Top + Height - 1);
if(Width > 1)
{
LTP_DrawLine(RPort,Left + Width - 2,Top + 1,Left + Width - 2,Top + Height - 1);
LTP_SetAPen(RPort,Pens[SHADOWPEN]);
WritePixel(RPort,Left + Width - 2,Top);
if(Width > 2)
{
LTP_DrawLine(RPort,Left,Top,Left + Width - 3,Top);
LTP_SetAPen(RPort,Pens[SHINEPEN]);
LTP_DrawLine(RPort,Left,Top + Height - 1,Left + Width - 3,Top + Height - 1);
LTP_SetAPen(RPort,Pens[BACKGROUNDPEN]);
RectFill(RPort,Left,Top + 1,Left + Width - 3,Top + Height - 2);
}
}
EraseRect(RPort,Left,Top - BorderTop,Left + Width - 1,Top - 1);
LTP_EraseBox(RPort,Left,Top + Height,Width,BorderTop);
EraseRect(RPort,Left + Width,Top - BorderTop,Left + Width + BorderLeft - 1,Top + Height + BorderTop - 1);
}
else
{
Width = Image->Width - (Level->Position + 2 * BorderLeft);
if(Width > 0)
{
Left = Image->LeftEdge + OffsetX + 2 * BorderLeft + Level->Position;
EraseRect(RPort,Left,Top - BorderTop,Left + Width - 1,Top + Height + BorderTop - 1);
}
}
}
/*****************************************************************************/
STATIC VOID
DrawLevelImageComplete(struct Image *Image,struct RastPort *RPort,UWORD *Pens,LevelImageInfo *Level,LONG OffsetX,LONG OffsetY,BOOL Selected)
{
LONG BorderTop = Level->KnobTop,
BorderLeft = Level->KnobWidth,
Left,Top,
Width,Height;
LONG Position;
Left = Image->LeftEdge + BorderLeft;
Top = Image->TopEdge + BorderTop;
Width = Image->Width - 2 * BorderLeft;
Height = Image->Height - 2 * BorderTop;
Position = Level->Position + Left;
DrawLevelImageLeft(RPort,Pens,Level,Image,Left,Top,Position - BorderLeft - Left,Height,OffsetX,OffsetY);
DrawLevelImageRight(RPort,Pens,Level,Image,Position + BorderLeft,Top,Left + Width - (Position + BorderLeft),Height,OffsetX,OffsetY);
BltBitMapRastPort(Level->Knob[Selected ? 1: 0],0,0,RPort,Left + OffsetX + Level->Position - Level->KnobWidth,Image->TopEdge + OffsetY,Level->KnobWidth * 2,Image->Height,0xC0);
}
/*****************************************************************************/
STATIC ULONG
LevelClassDraw(struct Image *Image,struct impDraw *DrawMsg,LevelImageInfo *Level)
{
struct RastPort *RPort = DrawMsg->imp_RPort;
// It doesn't work reliably under v2.04 without these
if(!V39)
LTP_ResetRenderInfo(RPort);
DrawLevelImageComplete(Image,RPort,Level->Pens,Level,DrawMsg->imp_Offset.X,DrawMsg->imp_Offset.Y,DrawMsg->imp_State == IDS_SELECTED);
if(DrawMsg->imp_State == IDS_DISABLED)
LTP_GhostBox(RPort,Image->LeftEdge + DrawMsg->imp_Offset.X,Image->TopEdge + DrawMsg->imp_Offset.Y,Image->Width,Image->Height,Level->Pens[SHADOWPEN]);
return(TRUE);
}
/*****************************************************************************/
STATIC VOID
LevelClassSet(Class *class,struct Image *Image,struct opSet *SetMsg)
{
LevelImageInfo *Level = (LevelImageInfo *)INST_DATA(class,Image);
struct TagItem *Item,*List,*PositionItem = NULL;
LONG Width = Image->Width - 2 * Level->KnobWidth;
List = SetMsg->ops_AttrList;
while(Item = NextTagItem(&List))
{
switch(Item->ti_Tag)
{
case LVIA_Current:
Level->Current = Item->ti_Data;
break;
case LVIA_Max:
Level->Max = Item->ti_Data;
break;
case LVIA_Position:
PositionItem = Item;
break;
}
}
if(PositionItem)
{
LONG Position = (LONG)PositionItem->ti_Data;
if(Position < 0 || !Level->Max)
Position = 0;
else
{
if(Position > Width)
Position = Width;
}
Level->Position = Position;
}
else
{
if(Level->Max)
Level->Position = (Width * Level->Current) / Level->Max;
else
Level->Position = 0;
}
}
/*****************************************************************************/
STATIC BOOL
LevelClassGet(Class *class,struct Image *Image,struct opGet *GetMsg)
{
LevelImageInfo *Level = (LevelImageInfo *)INST_DATA(class,Image);
switch(GetMsg->opg_AttrID)
{
case LVIA_Current:
*GetMsg->opg_Storage = Level->Current;
return(TRUE);
case LVIA_Max:
*GetMsg->opg_Storage = Level->Max;
return(TRUE);
case LVIA_Position:
*GetMsg->opg_Storage = Level->Position;
return(TRUE);
case LVIA_KnobWidth:
*GetMsg->opg_Storage = Level->KnobWidth;
return(TRUE);
case IA_SupportsDisable:
*GetMsg->opg_Storage = TRUE;
return(TRUE);
}
return(FALSE);
}
/*****************************************************************************/
STATIC ULONG
LevelClassNew(Class *class,Object *object,struct opSet *SetMsg)
{
LONG Width = 0,
Height = 0;
LONG FontWidth = 0;
LONG Current = 0,
Max = 0;
struct DrawInfo *DrawInfo = NULL;
struct Screen *Screen = NULL;
struct TagItem *List,
*Item;
List = SetMsg->ops_AttrList;
while(Item = NextTagItem(&List))
{
switch(Item->ti_Tag)
{
case LVIA_Current:
Current = (LONG)Item->ti_Data;
break;
case LVIA_Max:
Max = (LONG)Item->ti_Data;
break;
case LVIA_DrawInfo:
DrawInfo = (struct DrawInfo *)Item->ti_Data;
break;
case LVIA_FontWidth:
FontWidth = Item->ti_Data;
break;
case LVIA_Screen:
Screen = (struct Screen *)Item->ti_Data;
break;
case IA_Width:
Width = Item->ti_Data;
break;
case IA_Height:
Height = Item->ti_Data;
break;
}
}
if(Width && Height >= 4 && DrawInfo && Screen)
{
struct Image *Image;
if(Image = (struct Image *)DoSuperMethodA(class,object,(Msg)SetMsg))
{
struct RastPort RastPort;
struct RastPort *RPort;
LevelImageInfo *Level = (LevelImageInfo *)INST_DATA(class,Image);
LONG QuarterWidth,
KnobWidth,
LevelHeight,
i;
LONG Depth;
struct BitMap *Friend;
LONG Shine,Shadow,Back,Fill;
UWORD *Pens;
memset(Level,0,sizeof(LevelImageInfo));
QuarterWidth = (FontWidth + 3) / 4,
KnobWidth = 3 * QuarterWidth,
LevelHeight = 2 + (2 * QuarterWidth * DrawInfo->dri_Resolution.X) / DrawInfo->dri_Resolution.Y;
if(LevelHeight >= Height)
LevelHeight = Height / 4;
if(LevelHeight < 2)
{
if(Height > 2)
LevelHeight = 2;
else
LevelHeight = Height;
}
Level->KnobWidth = KnobWidth;
Level->KnobTop = (Height - LevelHeight) / 2;
Level->LevelHeight = LevelHeight;
Level->Max = Max;
Level->Current = Current;
Level->Pens = DrawInfo->dri_Pens;
if(Max)
Level->Position = ((Width - 2 * KnobWidth) * Current) / Max;
else
Level->Position = 0;
Friend = Screen->RastPort.BitMap;
Depth = LTP_GetDepth(Friend);
Width = Level->KnobWidth * 2;
for(i = 0 ; i < 2 ; i++)
{
if(!(Level->Knob[i] = LTP_CreateBitMap(Width,Height,Depth,Friend,FALSE)))
{
CoerceMethod(class,object,OM_DISPOSE);
return(NULL);
}
}
InitRastPort(RPort = &RastPort);
Pens = Level->Pens;
Back = Pens[BACKGROUNDPEN];
for(i = 0 ; i < 2 ; i++)
{
RPort->BitMap = Level->Knob[i];
Fill = Pens[i ? FILLPEN : BACKGROUNDPEN];
Shine = Pens[SHINEPEN];
Shadow = Pens[SHADOWPEN];
SetRast(RPort,Fill);
LTP_RenderBevel(RPort,Pens,0,0,Width,Height,FALSE,2);
if(Fill == Shine || Fill == Shadow)
Shine = Shadow = Back;
LTP_SetAPen(RPort,Shine);
LTP_DrawLine(RPort,Width / 2,2,Width / 2,Height - 3);
LTP_SetAPen(RPort,Shadow);
LTP_DrawLine(RPort,Width / 2 - 1,2,Width / 2 - 1,Height - 3);
}
return((ULONG)Image);
}
}
return(NULL);
}
STATIC VOID
LevelClassDispose(Class *class,Object *object)
{
LevelImageInfo *Level = (LevelImageInfo *)INST_DATA(class,object);
LONG i;
for(i = 0 ; i < 2 ; i++)
{
if(Level->Knob[i])
{
WaitBlit();
break;
}
}
for(i = 0 ; i < 2 ; i++)
LTP_DeleteBitMap(Level->Knob[i],FALSE);
}
/*****************************************************************************/
ULONG SAVE_DS ASM
LTP_LevelClassDispatcher(REG(a0) Class *class,REG(a2) Object *object,REG(a1) Msg msg)
{
switch(msg->MethodID)
{
case IM_DRAW:
return(LevelClassDraw((struct Image *)object,(struct impDraw *)msg,(LevelImageInfo *)INST_DATA(class,object)));
case OM_SET:
LevelClassSet(class,(struct Image *)object,(struct opSet *)msg);
break;
case OM_GET:
if(LevelClassGet(class,(struct Image *)object,(struct opGet *)msg))
return(TRUE);
break;
case OM_NEW:
return(LevelClassNew(class,object,(struct opSet *)msg));
case OM_DISPOSE:
LevelClassDispose(class,object);
// Falls down through to the default case...
}
return(DoSuperMethodA(class,object,msg));
}
#endif /* DO_LEVEL_KIND */